perm filename FFT.PAS[S1,ALS]1 blob sn#408346 filedate 1979-01-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(*PROGRAM HEADER PAGE*)
C00005 00003	PROGRAM FFT(OUTPUT)
C00013 ENDMK
C⊗;
(*PROGRAM HEADER PAGE*)

(*PAS10 OPTIONS*) (* D+,R32*)

(*	            					     DEFAULT 

D+	DEBUG AND POSTMORTEM DUMP				-
E+	EXTERNAL CALLS TO LEVEL 1 PROCEDURES ALLOWED		-
Fn	FILE OPTION						1
I+	FORTRAN I/O IN EXTERNAL FORTRAN SUBROUTINES		-
L+	OBJECT LISTING						-
Rn 	SIZE OF LOW-SEGMENT 			        (SEE PAS10 MANUAL)
Sn   	MAX INSTRUCTIONS PER STATEMENT			       1000
T+	RUNTIME CHECK						+
U+	72 COLUMN FORMAT					-
Xn	HIGHEST REGISTER FOR PARAMETERS				6
*)

(*SLAC PCPASC OPTIONS*) (* B+,D+,M-*)

(*                   					     DEFAULT

A+	GENERATE 370 OBJECT MODULE				-
A-	GENERATE 370 ASSEMBLY MODULE
B+	BOUNDS CHECKING, BUT ALLOW 'BIG' CHARACTERS		-
C+	EMIT PCODE						+
D+	RUNTIME CHECKING OF POINTER, INDEX, SUBRANGE VALUES	-
E+	FILE IS IN EBCDIC CHARACTER SET				-
F+	SAVE FPR'S ON PROCEDURE/FUNCTION ENTRY			+
K+	ENABLE STATEMENT EXECUTION COUNTING			-
L+	LIST SOURCE PROGRAM					+
M+	72 COLUMN FORMAT					+
P+	DOUBLE-WORD BOUNDARY ALIGNMENT				-
S+	SAVE GPR'S ON PROCEDURE/FUNCTION ENTRY			+
T+	PRINT SYMBOL TABLES (FOR POST-PROCESSOR)		-
U+	GET STATISTICS?? 2ND PARAMETER TO PCODE BGN INSTR.	-
V+	?? 3RD PCODE BGN INSTRUCTION PARAMETER			-
X+	USE ACTUAL PROCEDURE NAMES FOR EXTERNAL REFERENCES	-
X-	GENERATE UNIQUE 8-CHAR NAMES FOR EXTERNAL REFERENCES
*)

(*S1 PCPASC OPTION DIFFERENCES*) (*$A+,B+,D+,M-*)

(*							     DEFAULT
	
A+	GENERATE S1 ASSEMBLY MODULE				-
A-	GENERATE S1 OBJECT MODULE
*)

(* SLAC/PDP-10 TRANSPORT DEPENDENCIES FLAGGED WITH "XSL10" *)
(* PDP-10/S-1 TRANSPORT DEPENDENCIES FLAGGED WITH "X10S1" *)
PROGRAM FFT(OUTPUT);

CONST
M=	6;
N=	64;
NLINES= 64;
NPRD=	4;
NCOL=	35;
PI=	3.1415926536;

TYPE
COMPLEX=	RECORD RL: REAL; IM: REAL END;

VAR
XARG:		REAL;
SIG:		ARRAY [1 .. N] OF COMPLEX;
TRANS:		ARRAY [1 .. N] OF COMPLEX;

(**********************************************************************)

PROCEDURE CADD(VAR RESULT: COMPLEX;
	       X, Y: COMPLEX);
BEGIN
RESULT.RL:=X.RL+Y.RL;
RESULT.IM:=X.IM+Y.IM;
END;

(**********************************************************************)

PROCEDURE CSUB(VAR RESULT: COMPLEX;
	       X, Y: COMPLEX);
BEGIN
RESULT.RL:=X.RL-Y.RL;
RESULT.IM:=X.IM-Y.IM;
END;

(**********************************************************************)

PROCEDURE CMULT(VAR RESULT: COMPLEX;
	        X, Y: COMPLEX);
BEGIN
RESULT.RL:=X.RL*Y.RL-X.IM*Y.IM;
RESULT.IM:=X.RL*Y.IM+X.IM*Y.RL;
END;

(**********************************************************************)

FUNCTION PWR2(EXP: INTEGER): INTEGER;

VAR
I,P :  INTEGER;

BEGIN
P:=1;
FOR I:=1 TO EXP DO P:=P*2;
PWR2:=P;
END;
 
(**********************************************************************)

FUNCTION LLWBOTH: REAL;
VAR
X,SIGNREV,XSQ :  REAL;

BEGIN

X := XARG;
SIGNREV := 1.0;
IF X < 0.0 THEN BEGIN
  X := -X;
  SIGNREV := -SIGNREV
END;

X := X - 2*PI*TRUNC(X/(2*PI));
CASE TRUNC(X/(PI/2)) OF
 0: ;
 1: X := PI - X;
 2: BEGIN X := X - PI;  SIGNREV := -SIGNREV END;
 3: BEGIN X := 2*PI - X;  SIGNREV := -SIGNREV END;
 4: X := X - 2*PI
END (*case*);

XSQ := X*X;
LLWBOTH := SIGNREV*X*(1-XSQ*(1/6-XSQ*(1/120-XSQ*(1/5040))));
(*  LLWBOTH := SIGNREV*X*(1-XSQ*(IFACT3-XSQ*(IFACT5-XSQ*(IFACT7)))); *)

END (*LLWBOTH*);

(**********************************************************************)

FUNCTION LLWCOS(X: REAL): REAL;

BEGIN
XARG:=X+PI/2;
LLWCOS:=LLWBOTH
END;

(**********************************************************************)

FUNCTION LLWSIN(X: REAL): REAL;

BEGIN
XARG:=X;
LLWSIN:=LLWBOTH
END;

(**********************************************************************)

FUNCTION LLWSQRT(X: REAL): REAL;

CONST
THRESH=	0.00000001;

VAR
APPROX :  REAL;
LAST←APPROX :  REAL;

BEGIN

APPROX:=X;
REPEAT
  LAST←APPROX:=APPROX;
  APPROX:=(APPROX+X/APPROX)/2;
UNTIL ABS(APPROX-LAST←APPROX)<THRESH;
LLWSQRT:=APPROX;

END;

(**********************************************************************)

PROCEDURE INITSIG;

VAR
I :  INTEGER;

BEGIN
  FOR I:=1 TO N DO BEGIN
    SIG[I].RL:=LLWSIN((I-1)*2*PI*NPRD/N);
    SIG[I].IM:=0;
    TRANS[I]:=SIG[I];
  END;
END;

(**********************************************************************)

PROCEDURE WRT←GRAPHS;

VAR
J,X←INDX,I,NSPACE :  INTEGER;
MAX←SIG,
MIN←SIG,
SIG←SCALE,
MAX←TRANS,
MIN←TRANS,
TRANS←SCALE :  REAL;

BEGIN

FOR I:=1 TO N DO
  TRANS[I].RL:=LLWSQRT(TRANS[I].RL*TRANS[I].RL+TRANS[I].IM*TRANS[I].IM);

MAX←SIG:=SIG[1].RL;
MIN←SIG:=SIG[1].RL;
MAX←TRANS:=TRANS[1].RL;
MIN←TRANS:=TRANS[1].RL;

FOR I:=2 TO N DO BEGIN
  IF SIG[I].RL>MAX←SIG THEN MAX←SIG:=SIG[I].RL;
  IF SIG[I].RL<MIN←SIG THEN MIN←SIG:=SIG[I].RL;
  IF TRANS[I].RL>MAX←TRANS THEN MAX←TRANS:=TRANS[I].RL;
  IF TRANS[I].RL<MIN←TRANS THEN MIN←TRANS:=TRANS[I].RL;
END;

IF (MAX←SIG-MIN←SIG)<1.0E-20
THEN SIG←SCALE:=1.0
ELSE SIG←SCALE:=NCOL/(MAX←SIG-MIN←SIG);

IF (MAX←TRANS-MIN←TRANS)<1.0E-20
THEN TRANS←SCALE:=1.0
ELSE TRANS←SCALE:=NCOL/(MAX←TRANS-MIN←TRANS);

FOR I:=1 TO NLINES DO BEGIN
  X←INDX:=TRUNC(N*I/NLINES);
  
  NSPACE:=TRUNC(SIG←SCALE*(SIG[X←INDX].RL-MIN←SIG));
  FOR J:=1 TO NSPACE DO WRITE(' ');
  WRITE('*');
  FOR J:=NSPACE-2 TO NCOL DO WRITE(' ');

  NSPACE:=TRUNC(TRANS←SCALE*(TRANS[X←INDX].RL-MIN←TRANS))+3;
  FOR J:=1 TO NSPACE DO WRITE(' ');
  WRITE('*');

  WRITELN();
END;
  
END;

(**********************************************************************)

PROCEDURE XFORM;

VAR
I,J,K,L,IP,LE,LE1 : INTEGER;
U,W,T :  COMPLEX;

BEGIN

J:=1;
FOR I:=1 TO N-1 DO BEGIN
  IF I<J THEN BEGIN
    T:=TRANS[J];
    TRANS[J]:=TRANS[I];
    TRANS[I]:=T;
  END;
  K:=N DIV 2;
  WHILE K<J DO BEGIN
    J:=J-K;
    K:=K DIV 2;
  END;
  J:=J+K;
END;

FOR L:=1 TO M DO BEGIN
  LE:=PWR2(L);
  LE1:=LE DIV 2;

  U.RL:=1.0;  
  U.IM:=0.0;

  W.RL:=LLWCOS(PI/LE1);
  W.IM:=LLWSIN(PI/LE1);

  FOR J:=1 TO LE1 DO BEGIN
    I:=J;
    REPEAT
      IP:=I+LE1;
      CMULT(T,TRANS[IP],U);
      CSUB(TRANS[IP],TRANS[I],T);
      CADD(TRANS[I],TRANS[I],T);
      I:=I+LE;
    UNTIL I>N;
    CMULT(U,U,W);
  END;
END;

END;

(**********************************************************************)

BEGIN

INITSIG;
XFORM;
WRT←GRAPHS;

END.

(**********************************************************************)